package com.hspedu.map_;

import java.util.Comparator;
import java.util.TreeMap;

/**
 * @Author Stringzhua
 * @Date 2024/3/13 17:37
 * description:
 */
@SuppressWarnings("all")
public class TreeMap_ {
    public static void main(String[] args) {
        //使用默认的构造器,创建TreeMap是无序的(没有排序)
//        TreeMap treeMap = new TreeMap();
//        要求按照传入的k(String)的大小进行排序 hsp可以加进去
//        TreeMap treeMap = new TreeMap(new Comparator() {
//            @Override
//            public int compare(Object o1, Object o2) {
////                return ((String)o1).compareTo((String)o2);//从小到大
//                return ((String)o2).compareTo((String)o1);//从大到小
//            }
//        });
        //要求按字符串长度进行排序 hsp加不进去 这里不是替换,直接被返回
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
//                return ((String)o1).length()-((String)o2).length();//从小到大
                return ((String) o2).length() - ((String) o1).length();//从小到大
            }
        });

        treeMap.put("jack", "杰克");
        treeMap.put("tom", "汤姆");
        treeMap.put("kristina", "克瑞斯提诺");
        treeMap.put("smith", "史密斯");
        treeMap.put("hsp", "韩顺平");//hsp加不进去 这里不是替换,直接被返回

        System.out.println("treeMap = " + treeMap);

        /*
        * 源码解读:
        * 1.构造器:把传入的实现了Comparator接口的匿名内部类(对象),传给TreeMap(Comparator<? super K> comparator)
        * public TreeMap(Comparator<? super K> comparator) {
                this.comparator = comparator;
            }
          2.调用put方法
          2.1 第一次添加,把k-v 封装到Entry对象,放入到root
           if (t == null) {
                compare(key, key); // type (and possibly null) check

                root = new Entry<>(key, value, null);
                size = 1;
                modCount++;
                return null;
            }
          2.2 以后添加
            Comparator<? super K> cpr = comparator;
             if (cpr != null) {
                do { //遍历所有的key,给当前的key找到适当的位置挂载
                        parent = t;
                        cmp = cpr.compare(key, t.key);//动态绑定到匿名内部类的compare
                        if (cmp < 0)
                            t = t.left;
                        else if (cmp > 0)
                            t = t.right;
                        else //如果遍历过程中,发现准备加入的Key和当前已有的Key 相等,就不添加
                            return t.setValue(value);
                    } while (t != null);
                }
        * */
    }
}
